// 动态规划算法
// 编辑距离
public class LevenshteinDistance {

    /**
     * 比较两个字符串的相识度
     * 核心算法：用一个二维数组记录每个字符串是否相同，如果相同记为0，不相同记为1，每行每列相同个数累加
     * 则数组最后一个数为不相同的总数，从而判断这两个字符的相识度
     * @param str
     * @param target
     * @return
     */
    private static int compare(String str, String target) {

        int Matrix[][]; // 矩阵
        int n = str.length();
        int m = target.length();
        int i; // 遍历str的
        int j; // 遍历target的
        char ch1; // str的
        char ch2; // target的
        int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1

        if (n == 0) return m;
        if (m == 0) return n;
        Matrix = new int[n + 1][m + 1];

        // 初始化第一列
        for (i = 0; i <= n; i++) Matrix[i][0] = i;

        // 初始化第一行
        for (j = 0; j <= m; j++) Matrix[0][j] = j;

        for (i = 1; i <= n; i++) {
            ch1 = str.charAt(i - 1);
            for (j = 1; j <= m; j++) {
                ch2 = target.charAt(j - 1);
                if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2)
                    temp = 0; // 相同
                else temp = 1; // 不相同
                // 左边+1，上边+1，左上角+temp取最小
                Matrix[i][j] = min(Matrix[i - 1][j] + 1, Matrix[i][j - 1] + 1, Matrix[i - 1][j - 1] + temp);
            }
        }

        /*for (i = 0; i <= n; i++) {
            for (j = 0; j <= m; j++) {
                if (i > 0 && j > 0) System.out.printf("\033[31mMatrix[%s][%s] = %s \033[0m\t ", i, j, Matrix[i][j]);
                else System.out.printf("Matrix[%s][%s] = %s \t", i, j, Matrix[i][j]);
            }
            System.out.println();
        }*/

        return Matrix[n][m];
    }

    /**
     * 获取最小的值
     */
    private static int min(int one, int two, int three) {
        return (one = one < two ? one : two) < three ? one : three;
    }

    /**
     * 获取两字符串的相似度
     */
    public static float getSimilarityRatio(String str, String target) {
        int max = Math.max(str.length(), target.length());
        return 1 - (float) compare(str, target) / max;
    }

    public static void main(String[] args) {

//        String a = "西红柿操鸡蛋";
//        String b = "西红柿操鸡蛋";
//        String b = "鸡蛋操西红柿";

//        String a = "西红柿操鸡蛋和青椒";
//        String b = "西红柿操和";

        String a = "大家好，士大夫习士大夫反近对广泛共和国我是平";
        String b = "习近平";

        System.out.println("相似度：" + getSimilarityRatio(a, b));

    }
}
